package cn.kgc.service.impl;


import cn.kgc.constants.Constants;
import cn.kgc.dto.BrandDto;
import cn.kgc.dto.ClassifyDto;
import cn.kgc.dto.ModelDto;
import cn.kgc.mapper.BrandMapper;
import cn.kgc.mapper.ClassifyMapper;
import cn.kgc.mapper.ModelMapper;
import cn.kgc.pojo.Classify;
import cn.kgc.pojo.Model;
import cn.kgc.service.ClassifyService;
import cn.kgc.utils.reids.RedisUtils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 商品分类 服务实现类
 * </p>
 *
 * @author psq
 * @since 2021-08-05
 */
@Slf4j
@Service
public class ClassifyServiceImpl extends ServiceImpl<ClassifyMapper, Classify> implements ClassifyService {

    //商品分类
    private final ClassifyMapper classifyMapper;
    //品牌
    private final BrandMapper brandMapper ;
    //品牌型号
    private final ModelMapper modelMapper;
    //redis工具类
    private final RedisUtils redisUtils;

    public ClassifyServiceImpl(ClassifyMapper classifyMapper, BrandMapper brandMapper, ModelMapper modelMapper, RedisUtils redisUtils) {
        this.classifyMapper = classifyMapper;
        this.brandMapper = brandMapper;
        this.modelMapper = modelMapper;
        this.redisUtils = redisUtils;
    }


    /*@Override
    public List<ClassifyDto> findClassifyTree() {
        //1.查询 所以的商品类
        List<ClassifyDto> list = classifyMapper.findClassifyTree();
        log.info("所有的商品类别：{}",list);
        //如果查询的数据不能为空
        if (list != null) {
            //2.根据商品类别别的id查询这个类别下面的所以品牌
            for (ClassifyDto classifyDto : list) {
                //获取分类id
                Long cid = classifyDto.getId();
                List<BrandDto> brandDtoList = brandMapper.findBrandDtoListByClassifyId(cid);
                log.info("所以品牌的集合：{}",brandDtoList);
               //3.根据类型id + 品牌id 查询 品牌下所有的商品类型（型号）
                if (brandDtoList != null) {
                    for (BrandDto brandDto : brandDtoList){
                        //获取品牌id
                        Long bid = brandDto.getId();
                        QueryWrapper<Object> wrapper = new QueryWrapper<>();
                        wrapper.eq("brandId",bid).eq("classifyId",cid);
                        List<ModelDto> modelDtoList = modelMapper.findModelDtoListByBrandIdAndClassifyId(wrapper);
                        log.info("商品类型（型号）：{}",modelDtoList);
                        //将所以的商品类型（型号添加到brandList）
                        brandDto.setModelList(modelDtoList);
                    }
                }
                //将所有的品牌添加到对应的分类中
                classifyDto.setBrandList(brandDtoList);
            }
        }
        log.info("最终的数据：{}",list);
        //封装
        return list;
    }*/

    @Override
    public List<ClassifyDto> findClassifyTree() {
        List<ClassifyDto> list = null;
        // 1.第一次查询的时候，从redis中获取数据
        String value = redisUtils.getValue(Constants.Redis.KEY_HOME_TREE);
        // 判断返回结果是不是为空
        // 1.查询所有的商品类别
        // 1.2 redis中没有值
        if (StringUtils.isBlank(value)) {
            list = classifyMapper.findClassifyTree();
            log.info("所有的商量类别：{}", list);
            // 如果查询的数据不为空
            if (list != null) {
                // 2.根据商品类别的id查询这个类别下所有的品牌
                for (ClassifyDto classifyDto : list) {
                    // 获取分类id
                    Long cid = classifyDto.getId();
                    List<BrandDto> brandDtoList = brandMapper.findBrandDtoListByClassifyId(cid);
                    log.info("所有品牌的集合：{}", brandDtoList);
                    // 3.根据类别id + 品牌id 查询 品牌下所有的商品类型（型号）
                    if (brandDtoList != null) {
                        List<ModelDto> modelDtoList = null;
                        for (BrandDto brandDto : brandDtoList) {
                            // 获取品牌id
                            Long bid = brandDto.getId();
                            QueryWrapper<Model> wrapper = new QueryWrapper<>();
                            wrapper.eq("brandId", bid)
                                    .eq("classifyId", cid);
                            modelDtoList = modelMapper.findModelDtoListByBrandIdAndClassifyId(wrapper);
                            //List<ModelDto> modelDtoList = modelMapper.findModelDtoListByBrandIdAndClassifyId(cid, bid);
                            log.info("商品类型（型号）：{}", modelDtoList);
                            // 将所有的商品类型(型号添加到brandList)
                            brandDto.setModelList(modelDtoList);
                        }
                    }
                    // 将所有的品牌添加到对应的分类中
                    classifyDto.setBrandList(brandDtoList);
                }
            }

            // 将list转成json
            String json = JSON.toJSONString(list);
            // 将list存入redis
            redisUtils.putValue(Constants.Redis.KEY_HOME_TREE, json);
        } else {
            // 1.1 有数据 直接返回 第一个参数是redis中返回的数据 第二个参数是List的泛型
            list = JSON.parseArray(value, ClassifyDto.class);
        }
        log.info("最终的数据：{}",list);
        return list;
    }


}
